home *** CD-ROM | disk | FTP | other *** search
/ MACD 5 / MACD 5.bin / workbench / tools / czesc_2 / mfilemode / source / loaders.c < prev    next >
C/C++ Source or Header  |  1994-09-05  |  4KB  |  159 lines

  1. // Loaders.c - Copyright © 1994 Mike Austin
  2.  
  3. #include <string.h>
  4. #include <exec/memory.h>
  5. #include <dos/exall.h>
  6. #include <proto/exec.h>
  7. #include <proto/dos.h>
  8. #include <proto/gadtools.h>
  9. #include <proto/multiuser.h>
  10. #include <pragmas/nofrag_pragmas.h>
  11. #include <proto/nofrag_protos.h>
  12. #include "MFileMode.h"
  13. #include "GUI.h"
  14.  
  15. VOID LoadVolumes(struct List *List)
  16. {
  17.     static struct DosList    *DosList;
  18.     static struct Node        *Node;
  19.     static UWORD            NumNodes = 0, Num;
  20.  
  21.     GT_SetGadgetAttrs(MainGadgets[GD_GAD_FILE], MainWnd, NULL,
  22.             GTLV_Labels,    ~0,
  23.             TAG_END);
  24.  
  25.     GT_SetGadgetAttrs(MainGadgets[GD_GAD_FILE], MainWnd, NULL,
  26.             GTLV_Top,    0,
  27.             TAG_END);
  28.  
  29.     FreeList(&FileList);
  30.  
  31.     if(DosList = LockDosList(LDF_VOLUMES | LDF_ASSIGNS | LDF_READ))
  32.     {
  33.         while(DosList = NextDosEntry(DosList, LDF_VOLUMES | LDF_ASSIGNS | LDF_READ))
  34.         {
  35.             if(Node = AllocVecItem(MemChain, sizeof(struct Node) +
  36.                     sizeof(UBYTE *) + strlen(BSTR2CSTR(DosList->dol_Name)) +
  37.                     2, MEMF_CLEAR))
  38.             {
  39.                 Node->ln_Name = (char *)(&(Node->ln_Name) + 1);
  40.                 strcpy((char *)(&(Node->ln_Name) + 1), BSTR2CSTR(DosList->dol_Name));
  41.                 strcat((char *)(&(Node->ln_Name) + 1), ":");
  42.  
  43.                 AddTail(&FileList, Node);
  44.             }
  45.             else
  46.                 AlertUser(MainWnd, "Can't allocate memory", "");
  47.  
  48.             NumNodes++;
  49.         }
  50.  
  51.         UnLockDosList(LDF_VOLUMES | LDF_ASSIGNS | LDF_READ);
  52.  
  53.         if(FileNames = AllocVecItem(MemChain, sizeof(UBYTE *) * NumNodes, 0L))
  54.         {
  55.             Node = FileList.lh_Head;
  56.  
  57.             for(Num = 0; Num < NumNodes; Num++)
  58.             {
  59.                 FileNames[Num] = Node->ln_Name;
  60.                 Node = Node->ln_Succ;
  61.             }
  62.         }
  63.         else
  64.             AlertUser(MainWnd, "Can't allocate memroy", "");
  65.     }
  66.     else
  67.         AlertUser(MainWnd, "Can't lock dos list", "");
  68.  
  69.     GT_SetGadgetAttrs(MainGadgets[GD_GAD_FILE], MainWnd, NULL,
  70.             GTLV_Labels,    &FileList,
  71.             TAG_END);
  72.  
  73.     GT_SetGadgetAttrs(MainGadgets[GD_GAD_PATH], MainWnd, NULL,
  74.             GTTX_Text,    NULL,
  75.             TAG_END);
  76. }
  77.  
  78. VOID LoadDirectory(BPTR Lock, struct List *List)
  79. {
  80.     struct ExAllControl    *EAControl;
  81.     struct ExAllData    EAData[4];
  82.     struct ExAllData    *Data;
  83.     struct Node            *Node;
  84.     UWORD                NumNodes = 0, Num;
  85.     BOOL                More;
  86.  
  87.     GT_SetGadgetAttrs(MainGadgets[GD_GAD_FILE], MainWnd, NULL,
  88.             GTLV_Labels,    ~0,
  89.             TAG_END);
  90.  
  91.     GT_SetGadgetAttrs(MainGadgets[GD_GAD_FILE], MainWnd, NULL,
  92.             GTLV_Top,    0,
  93.             TAG_END);
  94.  
  95.     FreeList(&FileList);
  96.  
  97.     if(EAControl = AllocDosObject(DOS_EXALLCONTROL, NULL))
  98.     {
  99.         EAControl->eac_LastKey = 0;
  100.  
  101.         do
  102.         {
  103.             More = ExAll(Lock, EAData, sizeof(struct ExAllData) * 4,
  104.                     ED_TYPE, EAControl);
  105.  
  106.             if(EAControl->eac_Entries != 0)
  107.             {
  108.                 Data = EAData;
  109.  
  110.                 do
  111.                 {
  112.                     if(Node = AllocVecItem(MemChain, sizeof(struct Node) +
  113.                             sizeof(UBYTE *) + strlen(Data->ed_Name) + 2,
  114.                             MEMF_CLEAR))
  115.                     {
  116.                         Node->ln_Name = (char *)(&(Node->ln_Name) + 1);
  117.                         strcpy((char *)(&(Node->ln_Name) + 1), Data->ed_Name);
  118.                         if(Data->ed_Type >= 0)
  119.                             strcat((char *)(&(Node->ln_Name) + 1), "/");
  120.  
  121.                         AddTail(&FileList, Node);
  122.                     }
  123.                     else
  124.                         AlertUser(MainWnd, "Can't allocate memory", "");
  125.  
  126.                     NumNodes++;
  127.  
  128.                     Data = Data->ed_Next;
  129.                 }
  130.                 while(Data);
  131.             }
  132.             else
  133.                 More = FALSE;
  134.         }
  135.         while(More);
  136.  
  137.         FreeDosObject(DOS_EXALLCONTROL, EAControl);
  138.  
  139.         if(FileNames = AllocVecItem(MemChain, sizeof(UBYTE *) * NumNodes, 0L))
  140.         {
  141.             Node = FileList.lh_Head;
  142.  
  143.             for(Num = 0; Num < NumNodes; Num++)
  144.             {
  145.                 FileNames[Num] = Node->ln_Name;
  146.                 Node = Node->ln_Succ;
  147.             }
  148.         }
  149.         else
  150.             AlertUser(MainWnd, "Can't allocate memory", "");
  151.     }
  152.     else
  153.         AlertUser(MainWnd, "Can't allocate dos object", "");
  154.  
  155.     GT_SetGadgetAttrs(MainGadgets[GD_GAD_FILE], MainWnd, NULL,
  156.             GTLV_Labels,    &FileList,
  157.             TAG_END);
  158. }
  159.